const http = require('http')
const url = require('url')
const fs = require('fs')
const path = require('path')
const crypto = require('crypto')  // 加密

http.createServer((req,res)=>{
    let { pathname } = url.parse(req.url,true)
    if(pathname == '/'){
        fs.createReadStream(
            path.join(__dirname,'index.html')
        ).pipe(res);
        return ;
    }
    let abs = path.join(__dirname,pathname);
    // 获得文件的属性信息，文件最后修改时间，大小
    // I/O 操作 异步  回调  
    fs.stat(path.join(__dirname,pathname),(err,stat) => {
        if(err) { // 容错处理
            res.statusCode = 404;
            res.end('NON FIND!')
        }
        if(stat.isFile()) { // 是文件
            // res.setHeader('Last-Modified',stat.ctime.toGMTString()); // 文件最近修改时间
            // if(req.headers['if-modified-since'] == stat.ctime.toGMTString()) {
            //     req.statusCode=304;
            //     res.end();
            //     return ;
            // }
            // etag方法
            let md5 = crypto.createHash('md5');
            let rs = fs.createReadStream(abs); // 硬盘流向内存
            let arr = [];  // 文件chunk
            rs.on('data',function(chunk) { // 一块块的chunk，触发data事件
                md5.update(chunk);
                arr.push(chunk);
            })
            rs.on('end',function() {  // 读入内存结束
                let etag = md5.digest('base64');
                if(req.headers['if-none-match'] === etag) {
                    res.statusCode = 304;
                    res.end();
                    return ;
                }
                res.setHeader('Etag',etag);
                res.end(Buffer.concat(arr));
            })
            // fs.createReadStream(abs).pipe(res);
        }
    })
}).listen(3000)